#include <cassert>
#include <iostream>
using namespace std;

constexpr int bonus[] = { // 编译期常量数组
  0, 0, 0, 0, 0, 0, // 填充哑元，这样下标6~24可以直接查表
  10000, 36, 720, 360, 80, 252, 108, 72, 54, 180, 72, 180, 119, 36, 306, 1080, 144, 1800, 3600
  };

int main() {
  int g[4][4]; // 第0行、第0列都是哑元，方便下标引用
  int rem = (1 + 9) * 9 / 2; // 1~9之和，找出开始能看见的那个数（以0代表）
  int* missing = nullptr;
  for(int r = 1; r <= 3; ++r) {
    for(int c = 1; c <= 3; ++c) {
      cin >> g[r][c];
      rem -= g[r][c]; // 都减去后剩余值就是0覆盖的那个数
      if(g[r][c] == 0) {
        missing = &g[r][c];
      }
    }
  }
  assert(missing != nullptr); // 一定有个值为0的元素
  *missing = rem; // 指针代替了v0版的循环和goto语句，引用却难有作为。
  for(int i = 0, row, col; i < 3; ++i) { // 刮开的三个位置
    cin >> row >> col;
    cout << g[row][col] << '\n'; // 读入/输出是不同的“频道”，不会混淆，无需保存后再输出
  }
  int sum = 0; // 数字和
  switch(int dir = 0; cin >> dir, dir) { // 方向
    case 1:
    case 2: // 这是“fallthrough”的好例子
    case 3:
      sum = g[dir][1] + g[dir][2] + g[dir][3];
      break;
    case 4:
    case 5:
    case 6:
      dir -= 3; // 校正到1~3 // 至少有两人栽这了
      sum = g[1][dir] + g[2][dir] + g[3][dir];
      break;
    // 如果代码结构相似，为了突出对比，特意把几句合并在一行：
    case 7: sum = g[1][1] + g[2][2] + g[3][3]; break;
    case 8: sum = g[1][3] + g[2][2] + g[3][1]; break;
    default: assert(false); // 做题可以简单断言。工程上（比如汽车或飞机控制软件）则需谨慎处理。
  }
  cout << bonus[sum] << endl;
}